class Watcher {
  constructor(obj, key, cb) {
    this.obj = obj;

    // data中的属性名
    this.key = key;

    // 回调函数负责更新视图
    this.cb = cb;

    // 把 watcher对象记录到 Dep类的静态属性 target中
    Dep.target = this;

    // vue.$data.count => 会被Observer中的get劫持到
    // 触发 get方法，在 get方法中会调用 addSub
    this.oldValue = obj[key];

    /* 这里有一条隐形的鸿沟 */
    // Observer中的get回调 
    // 该回调中会将当前watcher实例添加到响应式数据count的粉丝团

    // 每条看门狗watcher实例 只能加入一次count的粉丝团
    Dep.target = null;
  }

  // 当数据发生变化的时候更新视图
  update() {
    const newValue = this.obj[this.key];

    // 数据没有发生变化直接返回
    // if (this.oldValue === newValue) {
    //     return;
    // }

    // 更新视图
    this.cb(newValue);
  }
}
